package com.kunyi.web.im.websocket;


import com.kunyi.web.im.websocket.handler.ExceptionHandler;
import com.kunyi.web.im.websocket.handler.WsSwitchHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketFrameDecoder;
import io.netty.handler.codec.http.websocketx.WebSocketServerHandshakerFactory;
import io.netty.handler.timeout.IdleStateHandler;


/**
 * @ClassName StompTransportServerInitializer
 * @Description 负责channel创建时的初始化配置
 * @Author zhenguo.zhuang
 * @Date 2024/03/29
 * @Version 1.0
 **/
public class StompTransportServerInitializer extends ChannelInitializer<SocketChannel> {

    /**
     * 超时时间
     */
    Integer timeoutTime;
    /**
     * @author: zhenguo.zhuang
     * @Description 初始化相关的类
     * @Date 16:23 2024/3/29
     * @Param channelGroup:
	 * @Param service: 管理通道，以及向客户端发送消息类
	 * @Param configMap: 相关配置，心跳检测时间等
     * @return null
     **/
    public StompTransportServerInitializer(Integer timeoutTime){
        this.timeoutTime = timeoutTime;
    }

    /**
     * @author: pengo.zhuang
     * @Description 初始化channel
     * @Date 16:23 2024/3/29
     * @Param socketChannel:
     * @return void
     **/
    @Override
    protected void initChannel(SocketChannel socketChannel) throws Exception {
        //获取channel的pipeline
        ChannelPipeline pipeline = socketChannel.pipeline();
        // 120秒超时时，触发   TextWebSocketFrameHandler 下的userEventTriggered方法
        pipeline.addLast(new IdleStateHandler(0, 0, timeoutTime));
        //因为是基于http协议，所以添加http协议的解码器
        pipeline.addLast(new HttpServerCodec());
        //http传输过程中是分段的，HttpObjectAggregator可以将多个段聚合，这就是为什么当浏览器发送大量数据时，就会发出n个请求的原因，所以需要加这个处理器，将多个合成一个
        pipeline.addLast("HttpObjectAggregator",new HttpObjectAggregator(64 * 1024*1024));
        //1.websocket它的数据是以帧（frame）的形式传递的
        //2.请求时,地址为 ws://localhost:7000/xxx 表示请求连接的uri   注意xxx写啥浏览器请求地址的xxx就是啥
        //3.需要将http协议升级为ws协议,保持长连接
        //------所以需要自定义添加一个WsSwitchHandler
        WsSwitchHandler handler = new WsSwitchHandler();
        pipeline.addLast(handler);
        //统一异常处理类
        ExceptionHandler exceptionHandler = new ExceptionHandler();
        pipeline.addLast(exceptionHandler);
    }
}
